package com.excilys.formation.project.repository;

import java.util.List;
import java.util.Map;

import org.joda.time.Interval;

import com.excilys.formation.project.entities.Operation;
import com.excilys.formation.project.entities.TypeOperation;

/**
 * Interface d'accès aux opérations.
 * 
 * @author excilys
 * 
 */
public interface OperationDAO {

    /**
     * Renvoie les opérations d'un certain type d'un compte donné dans un interval de temps.
     * 
     * @param compteNumero
     *            Le numéro du compte dont il faut récupérer les opérations
     * @param interval
     *            Interval de dates pour récupérer les opérations
     * @param type
     *            Type d'opérations à récupérer
     * @return les opérations d'un compte donné.
     */
    List<Operation> getOperationsByCompteAndTimeIntervalAndType(String compteNumero, Interval interval, TypeOperation type);

    /**
     * Renvoie les opérations d'un compte donné dans un interval de temps à l'exception des opérations d'un certain type.
     * 
     * @param compteNumero
     *            Le numéro du compte dont il faut récupérer les opérations
     * @param interval
     *            Interval de dates pour récupérer les opérations
     * @param type
     *            Type d'opérations à exclure
     * @return les opérations d'un compte donné.
     */
    List<Operation> getOperationsByCompteAndTimeIntervalExceptType(String compteNumero, Interval interval, TypeOperation type);

    /**
     * Renvoie la somme du montant des opérations d'un type donné dans un interval de temps.
     * 
     * @param compteNumero
     *            Le numéro du compte dont il faut sommer les montants des opérations
     * @param interval
     *            Interval de dates pour sommer les montants des opérations
     * @param type
     *            Type d'opérations dont il faut sommer les montants
     * @return les opérations d'un compte donné.
     */
    double getSumOperationsByCompteAndTimeIntervalAndType(String compteNumero, Interval interval, TypeOperation type);

    /**
     * Persiste une nouvelle opération ou les changements d'une existante.
     * 
     * @param operation
     *            l'opération à persister.
     */
    void save(Operation operation);

    /**
     * Renvoie la somme du montant des opérations d'un type donné dans un interval de temps.
     * 
     * @param compteNumero
     *            Le numéro du compte dont il faut sommer les montants des opérations
     * @return La somme de l'encours sur ce compte.
     */
    double getSumEncoursByCompte(String compteNumero);

    Map<String, Double> getSumEncoursByClient(long clientId);

}
